/**
 * Copyright  (c) 2009-2013 XLab,  Org. 
 * All  rights  reserved. 
 */
package org.xlab.baseframework.service.api;

import java.util.List;

import org.springframework.transaction.annotation.Transactional;
import org.xlab.baseframework.annotation.Loggable;
import org.xlab.baseframework.domain.ISystemRootUserDomain;
import org.xlab.baseframework.domain.ISystemUserDomain;
import org.xlab.baseframework.domain.SystemParameter;
import org.xlab.baseframework.domain.view.SystemParameterVO;
import org.xlab.baseframework.exception.PermissionDeniedException;
import org.xlab.baseframework.exception.SystemParameterDuplicateException;
import org.xlab.baseframework.exception.SystemParameterNotFoundException;
import org.xlab.baseframework.exception.SystemRuntimeException;
import org.xlab.baseframework.exception.ValidateFailedException;


/**
 * 系统参数服务接口定义
 * 
 * @author MaKuBEX Email:makubexnet@gmail.com
 * @version 1.0.0 Sep 9, 2010
 * @since 1.0.0
 * 
 */
public interface ISystemParameterService extends
		IBaseService<SystemParameterVO, SystemParameter> {

	/**
	 * 创建一个高级类型的系统参数
	 * 
	 * @param code
	 *            系统参数代码
	 * @param value
	 *            系统参数值
	 * @param description
	 *            代码描述
	 * @param remark
	 *            参数值备注
	 * @param createdBy
	 *            创建人
	 * @throws ValidateFailedException
	 *             如果必要的参数验证出错
	 */
	@Loggable
	@Transactional
	public void createAdvancedParameter(String code, String value,
			String description, String remark, ISystemUserDomain createdBy)
			throws ValidateFailedException, SystemParameterDuplicateException;

	/**
	 * 创建一个基本类型的系统参数
	 * 
	 * @param code
	 *            系统参数代码
	 * @param value
	 *            系统参数值
	 * @param description
	 *            代码描述
	 * @param remark
	 *            参数值备注
	 * @param createdBy
	 *            创建人
	 * @throws ValidateFailedException
	 *             如果必要的参数验证出错
	 */
	@Loggable
	@Transactional
	public void createBasicParameter(String code, String value,
			String description, String remark, ISystemUserDomain createdBy)
			throws ValidateFailedException, SystemParameterDuplicateException;

	/**
	 * 创建一个系统类型的系统参数
	 * 
	 * @param code
	 *            系统参数代码
	 * @param value
	 *            系统参数值
	 * @param description
	 *            代码描述
	 * @param remark
	 *            参数值备注
	 * @param systemRootUser
	 *            系统超级管理员
	 * @throws ValidateFailedException
	 *             如果必要的参数验证出错
	 */
	@Loggable
	@Transactional
	public void createSystemParameter(String code, String value,
			String description, String remark,
			ISystemRootUserDomain systemRootUser)
			throws ValidateFailedException, SystemParameterDuplicateException;

	/**
	 * 删除一个系统参数
	 * 
	 * @param systemParameter
	 *            系统参数实体
	 * @throws UnsupportedOperationException
	 *             如果强行删除一个高级或者系统定义的参数
	 */
	@Loggable
	@Transactional
	public void deleteParameter(SystemParameter systemParameter)
			throws UnsupportedOperationException;

	/**
	 * 获取系统中全部已经定义的系统参数
	 * 
	 * @return 系统中全部已经定义的系统参数
	 * @throws SystemParameterNotFoundException
	 *             如果没有任何系统参数定义
	 */
	public List<SystemParameter> findAll()
			throws SystemParameterNotFoundException;

	/**
	 * 获取系统中已经存在系统参数
	 * 
	 * @param code
	 *            参数代码
	 * @param useCache
	 *            是否从缓存中获取
	 * @return 系统参数
	 * @throws SystemRuntimeException
	 *             如果系统没有被初始化
	 * @throws SystemParameterNotFoundException
	 *             如果代码对应的参数没有被找到
	 */
	public SystemParameter findByCode(String code, boolean useCache)
			throws SystemRuntimeException, SystemParameterNotFoundException;

	/**
	 * 更新一个基础或者高级类型的系统参数
	 * 
	 * @param systemParameter
	 *            系统参数实体
	 * @param deletedBy
	 *            操作人
	 * @throws UnsupportedOperationException
	 *             如果更新一个系统定义的参数
	 * @throws SystemParameterNotFoundException
	 *             如果需要更新的系统参数并不存在
	 * @throws SystemRuntimeException
	 *             如果系统尚未被初始化
	 * @throws PermissionDeniedException
	 *             如果更新一个高级系统参数,而更新人并不是系统管理员
	 */
	@Loggable
	@Transactional
	public void updateNonSystemParameter(SystemParameter systemParameter,
			ISystemUserDomain updatedBy) throws UnsupportedOperationException,
			SystemParameterNotFoundException, SystemRuntimeException,
			PermissionDeniedException;
}
